Skip to main content

CVL KRA Upload API

This document highlights the CVL KRA Upload API details.

Objective

The CVL KRA Upload API manages the submission and modification of KYC applications in the KYC registration agency. The API supports new KYC submissions, and modifications based on the application's status.

API URL

https://ind-engine.thomas.hyperverge.co/v1/async/CVLKRAUpload

API Endpoint

CVLKRAUpload

Overview

The API is RESTful and uses standard HTTP verbs and status codes. The responses are in JSON format and you should upload all images and files as form-data through a POST request.

Authentication

You need a unique pair of application ID (appId) and application key (appKey) from HyperVerge to verify your identity for accessing the API.

API Request Details

Method - POST

Headers

ParameterMandatory or OptionalDescriptionAllowed Values
content-type MandatoryThis parameter defines the media type for the request payloadapplication/json
appId MandatoryThe application identifier shared by HyperVerge. You can find the details in the dashboard's credentials tab.This should be a unique value.
appKey MandatoryThe application key shared by HyperVerge. You can find the details in the dashboard's credentials tab.This should be a unique value.
transactionIdMandatoryA unique identifier for tracking a user journeyThis should be both unique and easily associated with the user's journey in your application(s)

Inputs

The following table provides the details of the parameters required for the API's request body:

ParameterDescriptionMandatory or OptionalAllowed Values
appUpdtflgThe value should be selected based on the current status of the KYC application (obtained from the CVL Search and Verify API).

How to choose the correct value:
  • New: Use for first-time KYC submissions or when no existing KYC is found
  • Modify with documents: Use when updating KYC details that require document verification (e.g., address changes)
  • Interop Modification: Use when the KYC exists in other KRAs and needs modification
For detailed mapping based on application status, refer to the appStatus and appUpdtflg mapping table below.
Mandatory
  • new
  • modify_with_doc
  • interop_modification
kraAgencySpecifies the KYC Registration Agency (KRA) that will handle the KYC applicationMandatory
  • CVLKRA
  • NDML
  • DOTEX
  • CAMS
  • KARVY
  • bse
appTypeSpecifies whether the application is for an individual applicant or a non-individual applicant
Note
From this point forward, 'user' refers to an individual applicant, and 'organization' refers to a non-individual applicant.
Mandatory
  • individual
  • non_individual
appNoThe unique number generated for each KYC application OptionalNot Applicable
appDateThe date on which the KYC application was submittedMandatoryThe input format for this parameter should be 'DD-MM-YYYY'
appPanNoThe PAN of the userMandatoryNot Applicable
appPanCopyThe value is 'yes' if the user's PAN card image has been submitted; otherwise, the value is 'no'Mandatoryyes or no
appExmtThe value is 'no' if the user's PAN card image has been submitted, and 'yes' if user's exempted from submitting the PAN cardMandatoryyes or no
appExmtCatThe user was exempted from submitting their PAN card image due to one or more valid reasons. For the complete list of exemption criteria, please refer to this pageOptionalAllowed Values
appExmtIdProofThe document used as Proof of Identity. For the complete list of valid ID proof documents, please refer to this page.MandatoryAllowed Values
appIpvFlagThe value is 'yes' if an In-Person Verification (IPV) was conducted for the KYC application; 'no' if not conducted, or 'exempted' if completed online.Mandatory
  • yes
  • no
  • exempted
appIpvDateThe date when the IPV was conducted, if applicableOptionalThe input format for this parameter should be 'DD-MM-YYYY'
appGenThe gender of the user. Valid values are F (Female), M (Male), and T (Transgender)Mandatory
  • F
  • M
  • T
appNameThe name of the userMandatoryNot Applicable
appFNameThe name of the user's father/husbandMandatoryNot Applicable
appRegnoThe registration number of the organizationOptionalNot Applicable
appDobIncorpThe date of birth of the user or the incorporation date of the organizationMandatoryThe input format for this parameter should be 'DD-MM-YYYY'
appCommenceDtThe date when the organization commenced businessOptionalThe input format for this parameter should be 'DD-MM-YYYY'
appNationalityThe nationality of the userMandatory
  • indian
  • others
appOthNationalityThe user's nationality, if not Indian; for example, Argentina, Greece, etcOptional.
(Mandatory if user nationality is 'Others')
Not Applicable
appCompStatusThe type of organization. For the complete list of different types of valid organizations, please refer to this pageMandatoryAllowed Values
appOthCompStatusThe status of the company, if 'Others' (as from appCompStatus's value) OptionalNot Applicable
appResStatusThe residential status of the user. It could be one of the following:
  • Resident Individual
  • Non-Resident Individual
  • Foreign National
  • QFI
  • Eligible Foreign Investor - Category III
Mandatory
  • resident_indian_individual
  • non_resident_indian_individual
  • foreign_national
  • qfi
  • eligible_foreign_investor_category
appResStatusProofThe address proof for a non-residential Indian or person of Indian origin. It could be one of the following documents:
  • Passport
  • PIO Card
  • OCI Card
Optional
  • passport
  • PIO_card
  • OCI_card
appUidNoThe last four digits of the UID/Aadhaar number of the userOptionalNot Applicable
appCorAdd1The first line of the correspondence address. It includes the house number and the street name.MandatoryNot Applicable
appCorAdd2The second line of the correspondence address. It includes the district name.OptionalNot Applicable
appCorAdd3The third line of the correspondence address. It includes the name of the corresponding state.OptionalNot Applicable
appCorCityThe correspondence cityMandatoryNot Applicable
appCorPincdThe PIN code for the correspondence addressMandatoryNot Applicable
appCorStateThe correspondence state,if the user's nationality is IndianMandatory Allowed Values
appCorCtryThe correspondence countryMandatoryNot Applicable
Default Value: India
appOffIsdThe ISD code for the user's office contact numberOptionalNot Applicable
appOffStdThe STD code for the user's office contact numberOptionalNot Applicable
appOffNoThe user's office contact numberOptionalNot Applicable
appResIsdThe ISD code for the user's residential contact numberOptionalNot Applicable
appResStdThe STD code for the user's residential contact numberOptionalNot Applicable
appResNoThe user's residential contact numberOptionalNot Applicable
appMobIsdThe ISD code for the user's mobile phone numberOptionalNot Applicable
appMobNoThe user's mobile phone numberMandatoryNot Applicable
appFaxIsdThe ISD code for the user's fax numberOptionalNot Applicable
appFaxStdThe STD code for the user's fax numberOptionalNot Applicable
appFaxNoThe fax number for the userOptionalNot Applicable
appEmailThe email address of the userMandatoryNot Applicable
appCorAddProofThe document serving as proof of the correspondence address.
For the complete list of accepted documents, please refer to this page.
MandatoryAllowed Values
appCorAddRefThe identification number linked to the correspondence address proof document. For instance, if the Aadhaar card is provided as the address proof, the Aadhaar number serves as the reference ID.OptionalNot Applicable
appCorAddDtThe validity date of the corresponding address proof, as specified in the address proof documentOptionalThe input format for this parameter should be 'DD-MM-YYYY'
appPerAddFlagThis flag indicates whether the permanent residential address matches the corresponding address. If they match, the corresponding address value is used; otherwise, the permanent address must be provided separately in the subsequent address parametersMandatoryyes, no
appPerAdd1The first line of the permanent address. It includes the house number and the street name.MandatoryNot Applicable
appPerAdd2The second line of the permanent address. It includes the name of the district.OptionalNot Applicable
appPerAdd3The third line of the permanent address. It includes the name of the state.OptionalNot Applicable
appPerCityThe city of the permanent addressMandatoryNot Applicable
appPerPincdThe PIN code for the permanent addressMandatoryNot Applicable
appPerStateThe state of the permanent addressMandatoryAllowed Values
appPerCtryThe country of the permanent addressMandatoryNot Applicable
Default Value: India
appPerAddProofThe document serving as proof of the permanent address.
For the complete list of accepted documents, please refer to this page.
MandatoryAllowed Values
appPerAddRefThe identification number linked to the permanent address proof document. For instance, if the Aadhaar card is provided as the address proof, the Aadhaar number serves as the reference ID.OptionalNot Applicable
appPerAddDtThe validity date of the permanent address proof, as specified in the address proof documentOptionalThe input format for this parameter should be 'DD-MM-YYYY'
appIncome

The user's gross annual income, represented as a range. For more details on income slabs, please refer to this page.

OptionalAllowed Values
appOccThe occupation of the user, specified by selecting a domain from this list.OptionalAllowed Values
appOthOccThe occupation details of the user, if 'Others' (as from appOcc's value)OptionalNot Applicable
appPolConnThe PEP status of the user, which they can select based on the category that applies to them. The categories are:
  • Not Politically Exposed
  • Politically Exposed Person (PEP)
  • Related to a Politically Exposed Person(RPEP)
Optional
  • not_applicable
  • politically_exp_person
  • related_politically_exp_person
appDocProofThe details of the documents submitted by the user: whether they are self-certified copies or true copies of the documents, or if they are exempted from submitting any documents altogetherMandatory
  • self_certi_copies_submitted
  • true_copies_received
  • exempted
appInternalRefInternal reference number for intermediariesOptionalNot Applicable
appBranchCodeThe branch code to which the KYC is attachedOptionalNot Applicable
appMarStatusThe marital status of the user, whether they are married or unmarriedMandatory
  • married
  • unmarried
appNetwrthThe net worth of the user or the organizationOptionalThe input format for this parameter should be a numeric value
appNetworthDtThe net worth of the user or the organization as on dateSelectively Optional*The input format for this parameter should be "DD-MM-YYYY"
Note
Selectively Optional*: This is optional if the gross annual income is specified for a user. If the net worth is provided for an organization, then this parameter is mandatory.
appIncorpPlcThe place of incorporation of the organization, if applicableOptionalNot Applicable
appOtherInfoAny additional informationOptionalNot Applicable
appIpvNameThe name of the person who is carrying out the in-person verification(IPV), if applicableOptionalNot Applicable
appIpvDesgThe designation of the person carrying out the IPV applicationOptionalNot Applicable
appIpvOrganThe organization of the individual who carried out the IPV applicationOptionalNot Applicable
appKycModeThe mode of KYC verification. It could be one of the following:
  • Normal(In-person) KYC
  • e-KYC with OTP
  • e-KYC with Biometric
  • Online Data Entry and IPV
  • Offline KYC - Aadhaar
  • Digilocker
Mandatory
  • normal_kyc
  • ekyc_with_otp
  • ekyc_with_biometric
  • online_data_entry
  • offline_kyc
  • digilocker
appVidNoThe Aadhaar Virtual ID Number of the user or organizationOptionalNot Applicable
appUidTokenThe Aadhaar UID TokenOptionalNot Applicable
appVerNoThe version numberOptionalNot Applicable
appAuthNameThe name of the Foreign Portfolio Investment (FPI) authorizer OptionalNot Applicable
appAuthEmailThe email address of the FPI authorizerOptionalNot Applicable
appAuthEmail1The additional email address of the FPI authorizerOptionalNot Applicable
appAuthEmail2The additional email address of the FPI authorizerOptionalNot Applicable
appAuthMobileThe mobile number of the FPI authorizerOptionalNot Applicable
appAuthFpiConsentThe FPI consent for the authorized person, if anyOptionalyes or no
appAuthUboConsentUBO consent for the authorized person, if anyOptionalyes or no
noOfKycRecordsThe number of KYC recordsMandatoryNot Applicable
noOfAddldataRecordsThe number of additional data records, if anyOptionalNot Applicable
panThe Application Opening Form (AOF) containing all user detailsMandatoryNot Applicable
aadhaarThe Aadhaar in xml format MandatoryNot Applicable
appFatcaApplicableFlagThe confirmation on whether the application is subject to FATCA regulationsMandatoryYes or No

Request

The following code snippet demonstrates a standard curl request for the API:

curl --location --request POST 'https://ind-engine.thomas.hyperverge.co/v1/async/CVLKRAUpload' \
--header 'Content-Type: application/json' \
--header 'appId: <Enter_the_HyperVerge_appId>' \
--header 'appKey: <Enter_the_HyperVerge_appKey>' \
--header 'transactionId: <Enter_the_HyperVerge_transactionID>' \
--data '{
"appUpdtflg": "<Enter_Update_Flag>",
"kraAgency": "<Enter_the_KRA_undertaking_the_KYC_application>",
"appType": "<Enter_Applicant_Type>",
"appNo": "<Enter_Application_Number>",
"appPanNo": "<Enter_the_PAN>",
"appPanCopy": "<Enter_if_PAN_Copy_is_Submitted>",
"appExmt": "<Enter_Exemption_Status>",
"appExmtCat": "<Enter_Exemption_Category>",
"appExmtIdProof": "<Enter_Exemption_ID_Proof>",
"appIpvFlag": "<Enter_IPV_Flag>",
"appIpvDate": "<Enter_IPV_Date_in_DD-MM-YYYY>",
"appGen": "<Enter_Gender>",
"appName": "<Enter_Name>",
"appFName": "<Enter_Fathers_Name>",
"appRegno": "<Enter_Registration_Number>",
"appDobIncorp": "<Enter_Date_of_Birth_or_Incorporation_in_DD-MM-YYYY>",
"appCommenceDt": "<Enter_Commencement_Date>",
"appNationality": "<Enter_Nationality>",
"appOthNationality": "<Enter_Other_Nationality_if_Applicable>",
"appCompStatus": "<Enter_Company_Status>",
"appOthCompStatus": "<Enter_Other_Company_Status>",
"appResStatus": "<Enter_Residential_Status>",
"appResStatusProof": "<Enter_Residential_Status_Proof>",
"appUidNo": "<Enter_UID_Number>",
"appCorAdd1": "<Enter_Correspondence_Address_Line_1>",
"appCorAdd2": "<Enter_Correspondence_Address_Line_2>",
"appCorAdd3": "<Enter_Correspondence_Address_Line_3>",
"appCorCity": "<Enter_Correspondence_City>",
"appCorPincd": "<Enter_Correspondence_Pincode>",
"appCorState": "<Enter_Correspondence_State>",
"appCorCtry": "<Enter_Correspondence_Country>",
"appOffIsd": "<Enter_Office_ISD_Code>",
"appOffStd": "<Enter_Office_STD_Code>",
"appOffNo": "<Enter_Office_Number>",
"appResIsd": "<Enter_Residence_ISD_Code>",
"appResStd": "<Enter_Residence_STD_Code>",
"appResNo": "<Enter_Residence_Number>",
"appMobIsd": "<Enter_Mobile_ISD_Code>",
"appMobNo": "<Enter_Mobile_Number>",
"appFaxIsd": "<Enter_Fax_ISD_Code>",
"appFaxStd": "<Enter_Fax_STD_Code>",
"appFaxNo": "<Enter_Fax_Number>",
"appEmail": "<Enter_Email>",
"appCorAddProof": "<Enter_Correspondence_Address_Proof>",
"appCorAddRef": "<Enter_Correspondence_Address_Reference>",
"appCorAddDt": "<Enter_Correspondence_Address_Date>",
"appPerAddFlag": "<Enter_if_Permanent_Address_is_Same_as_Correspondence>",
"appPerAdd1": "<Enter_Permanent_Address_Line_1>",
"appPerAdd2": "<Enter_Permanent_Address_Line_2>",
"appPerAdd3": "<Enter_Permanent_Address_Line_3>",
"appPerCity": "<Enter_Permanent_City>",
"appPerPincd": "<Enter_Permanent_Pincode>",
"appPerState": "<Enter_Permanent_State>",
"appPerCtry": "<Enter_Permanent_Country>",
"appPerAddProof": "<Enter_Permanent_Address_Proof>",
"appPerAddRef": "<Enter_Permanent_Address_Reference>",
"appPerAddDt": "<Enter_Permanent_Address_Date>",
"appIncome": "<Enter_Gross_Annual_Income>",
"appOcc": "<Enter_Occupation>",
"appOthOcc": "<Enter_Other_Occupation>",
"appPolConn": "<Enter_Political_Connection_Status>",
"appDocProof": "<Enter_Document_Proof_Status>",
"appInternalRef": "<Enter_Internal_Reference>",
"appBranchCode": "<Enter_Branch_Code>",
"appMarStatus": "<Enter_Marital_Status>",
"appNetwrth": "<Enter_Net_Worth>",
"appNetworthDt": "<Enter_Net_Worth_Date_in_DD-MM-YYYY>",
"appIncorpPlc": "<Enter_Incorporation_Place>",
"appOtherInfo": "<Enter_Other_Information>",
"appFiller1": "<Enter_Filler_Field_1>",
"appFiller2": "<Enter_Filler_Field_2>",
"appFiller3": "<Enter_Filler_Field_3>",
"appIpvName": "<Enter_IPV_Name>",
"appIpvDesg": "<Enter_IPV_Designation>",
"appIpvOrgan": "<Enter_IPV_Organization>",
"appKycMode": "<Enter_KYC_Mode>",
"appVerNo": "<Enter_Version_Number>",
"appVidNo": "<Enter_VID_Number>",
"appUidToken": "<Enter_UID_Token>",
"appAuthName": "<Enter_Authorizer_Name>",
"appAuthEmail": "<Enter_Authorizer_Email>",
"appAuthEmail1": "<Enter_Alternate_Email_1>",
"appAuthEmail2": "<Enter_Alternate_Email_2>",
"appAuthMobile": "<Enter_Authorizer_Mobile>",
"appAuthFpiConsent": "<Enter_FPI_Consent_Status>",
"appAuthUboConsent": "<Enter_UBO_Consent_Status>",
"noOfKycRecords": "<Enter_Number_of_KYC_Records>",
"noOfAddldataRecords": "<Enter_Additional_Data_Records>",
"pan": "<PAN_Document>",
"aadhaar": "<Aadhaar_Document>",
"applicationStatus": "<Enter_Application_Status>",
"appFatcaApplicableFlag": "<Enter_FATCA_Applicability>"
}'

Success Response

The following code snippet demonstrates a success response from the API:

{
"status": "success",
"statusCode": "200",
"result": {
"kycdata": {
"appPanNo": "<PAN_Number_Of_The_Applicant>",
"appPanDob": "<Date_Of_Birth_Associated_With_PAN>",
"appName": "<Name_Of_The_Applicant>",
"appStatus": "<KYC_Application_Status>",
"appModfAck": "<Modification_Acknowledgment_Flag>",
"appStatusdt": "<Date_Of_KYC_Application_Status>",
"appEntrydt": "<Date_Of_KYC_Record_Entry>",
"appModdt": "<Date_Of_Last_Modification>",
"appPosCode": "<Point_Of_Service_Code>"
},
"footer": {
"appResponseDate": "<Timestamp_Of_The_Response>",
"appTotalRec": "<Total_Number_Of_Records>"
}
},
"metaData": {
"requestId": "<Unique_Request_Identifier>",
"transactionId": "<Transaction_Identifier>"
}
}

Success Response Details

The following table outlines the details of the success response from the API:

ParameterTypeDescription
statusstringThe status of the request
statusCodestringThe HTTP status code of the response
appPanNostringThe PAN number associated with the KYC application
appPanDobstringThe date of birth linked to the provided PAN
appNamestringThe name of the user or organization associated with the application
appStatusstringRepresents the initial status of the application
appModfAckstringThe acknowledgment flag for KYC modifications
appStatusdtstringThe date when the KYC application was initiated
appEntrydtstringThe date when the KYC application was entered into the system
appModdtstringThe date when the KYC application was last modified
appPosCodestringPOS code of the Asset Management Company (AMC) on whose behalf the request is being updated
appResponseDatestringThe date and time when the response was generated
appTotalRecstringThe total number of records in the response
requestIdstringThe unique identifier for the request
transactionIdstringThe unique identifier for the transaction

Error Responses

The following are some error responses from the API:

{
"status": "failure",
"statusCode": "400",
"message": "Invalid PAN format"
}
{
"message": "Missing/Invalid credentials",
"statusCode": 401,
"status": "failure"
}

Error Response Details

An error response from the module contains a failure status, with a relevant status code and error message.
The following table lists all error responses:

Status CodeError MessageError Description
400Invalid PAN formatThe PAN provided is not in the correct format. (‘CCCCCDDDDC’ format, where 'C' represents a character and 'D' represents a digit)
400Invalid DOB providedThe date of birth provided is not valid
400Invalid Record CountThe record count specified in the request is not valid
400Invalid request detailsThe request details provided are incomplete or incorrect
400Duplicate requestThe request has already been submitted previously
400Invalid Batch SizeThe batch size is invalid
400Invalid / Expired Batch NoThe batch ID (a unique ID assigned by the KRA for each batch) is invalid
401Missing/Invalid credentialsThe request is either missing the mandatory appId and appKey combination or has invalid values
415Unsupported media typeThe media type provided in the request is not supported
500Internal Server ErrorPlease check the request headers or contact the HyperVerge team for resolution
500Invalid User ID / PosCode / Password / Access Privilege Not SetThe provided user credentials or access privileges are not correctly configured
500Invalid XMLThe Aadhaar XML file provided is not valid
500Invalid Intermediary Code providedThe POS code of the AMC provided in the request is not valid

appStatus and appUpdtflg Mapping

Purpose: The following table provides a clear reference for selecting the appropriate appUpdtflg value based on the status of a user's KYC application. The status is identified by the Status field, which is returned by the CVL Search and Verify API.

StatusappUpdtflg
  1. KYC rejected
  2. Existing KYC Hold
  3. Hold
  4. KRA Validated
  5. Modification Registered
  6. Modification Hold
  7. Modification Rejected
  8. Modification Validated

Modify with document
In case the modification requires document proof, e.g., POA for verifying address

  1. KRA Verified
  2. Existing KRA Verified

Modify without document
In case the modification can be done without a document, e.g., verifying a phone number

  1. Submitted
  2. Not available

New
For fresh KYCs and rejected cases

If we have the following codes:
  1. 102/202/302/402
  2. 107/207/307/407
  3. 112/212/312/412
  4. 103/203/303/403
  5. 113/213/313/413
Interop Modification
In case KYC details are found in other KRAs like NDML/Dotex/Karvy/CAMS and the user wants to modify details— we utilize Interop Modification

KRA Webhook

The KRA Webhook facilitates real-time updates by notifying users about changes to the KRA application status. It enables seamless monitoring of application progress and can automate downstream processes, including document verification, communication, or follow-up actions. Please access the documentation for KRA Webhook here .

Was this helpful?
Ask AIBeta
Hi! How can I help?
Ask me anything about HyperVerge products, APIs, and SDKs.
Try asking: